﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <unordered_map>

using namespace std;

unordered_map<int, int> map;//记录擅长某个声部的人的个数

int n, m;

bool check(int x)
{
    int result = 0;//在每个声部人数为x的情况下，需要分成的声部个数
    for (auto& [a, b] : map)
    {
        result += b / x + (b % x ? 1 : 0);//先有b/x个，再看看是否还剩下不足x人数的，再组成一个声部
    }
    return result <= m;//注意是小于等于，排除小于不是这里完成的
}

int main()
{
    cin >> n >> m;

    int MaxNum = 0;//记录某个声部的最大值
    for (int i = 0; i < n; ++i)
    {
        int x = 0;
        cin >> x;
        MaxNum = (MaxNum, ++map[x]);//更新最大值
    }

    if (map.size() > m)//由于每一组的同学都必须擅长同一个分部，最小的声部数量为map.size()
        cout << -1 << endl;
    else
    {
        int begin = 1, end = MaxNum;
        while (begin < end)//二分查找寻找最适合的声部人数
        {
            int mid = (begin + end) >> 1;
            if (check(mid))//分组太小了，声部里面人数太大
                end = mid;//注意不要等于mid-1，因为mid可能等于m
            else
                begin = mid + 1;
        }
        cout << begin << endl;
    }

    return 0;
}

/*
链接：https://ac.nowcoder.com/acm/problem/229023
来源：牛客网

题目描述
dd当上了宣传委员，开始组织迎新晚会，已知班里有n个同学，
每个同学有且仅有一个擅长的声部，把同学们分成恰好m组，
为了不搞砸节目，每一组里的同学都必须擅长同一个声部，
当然，不同组同学擅长同一个声部的情况是可以出现的，毕竟一个声部也可以分成好几个part进行表演，
但是他不希望出现任何一组的人过多，否则可能会导致场地分配不协调，也就是说，
她希望人数最多的小组的人尽可能少，除此之外，对组内人员分配没有其他要求，她希望你告诉她，
这个值是多少，如果无法顺利安排，请输出-1

输入描述:
第一行两个数个数n,m(1≤m≤n≤100000)表示人数
接下来一行n个数,a[i](1≤a[i]≤n)表示第i个学生的擅长声部
输出描述:
输出一个数，表示人数最多的小组的人数

示例1
输入
5 3
2 2 3 3 3
输出
2
*/

